/*
 * gc.h
 *
 *  Created on: Nov 15, 2011
 *      Author: Rui Zhuang
 */

#ifndef GC_H_
#define GC_H_

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
//****************************************
// structs for garbage collector
//****************************************
#define TRUE 1
#define FALSE 0
#define bool int

typedef struct _gc_heap_node
{
  void* ptr;
  int size;
  bool reachable;
  struct _gc_heap_node * next;
}gc_heap_node;

typedef struct _gc_root_node
{
  void* ptr;
  struct _gc_root_node * next;
}gc_root_node;

//*****************************************
// Global variables for the gc
//*****************************************
extern bool g_debug;
extern gc_heap_node* g_ptrHeap;
extern gc_root_node* g_ptrRoot;
extern int    g_nCurrentHeapSize;

/* 1GB size limitation for heap */
extern int    g_nMaxHeapSize;

//*****************************************
//  public interface to use the GC
//*****************************************
void* gc_malloc(int size);
void gc_recycle();
void gc_init_max_heap_size(int size);
void gc_add_root_node(void* ptr);
void gc_free_root_node(void* ptr);

void gc_output_root_nodes();
void gc_output_heap_nodes();

//*****************************************
//  private interface used by GC
//*****************************************
void gc_mark();
void gc_sweep();
void gc_add_heap_node(void* heapNode, int size);
void gc_free_heap_node(gc_heap_node * heap_node_garbage);
int gc_check_heap_size();
void gc_check_heap_node_reachable(gc_heap_node* cur_heap_node);

#endif /* GC_H_ */
